#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Analog_to_Digital.h"
#include "Timer.h"
#include "DMA_TRANS.h"



void showAnalogVoltage(uint8_t lineNumber,uint16_t analog);


    
int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	
    
    //timer_init();
    uint16_t adc_channel_result[4] = {0,0,0,0};
    
    // 重点1：这里要对 DR 寄存器 取地址
    trans_m2m_dma((uint32_t)&ADC1->DR,(uint32_t)adc_channel_result,4);
    
    init_adc();
    
    // 重点2：为ADC1 开启 DMA 转运
    //ADC_DMACmd(ADC1,ENABLE);
    
    
	/*OLED显示*/


	OLED_ShowString(1, 1, "adc1:00.00v");
    OLED_ShowString(2, 1, "adc2:00.00v");
    OLED_ShowString(3, 1, "adc3:00.00v");
    OLED_ShowString(4, 1, "adc4:00.00v");
    
 
    //restart_dma();
	DMA_Cmd(DMA1_Channel1,ENABLE);
    
    // 触发启动 ADC 转换
    ADC_SoftwareStartConvCmd(ADC1,ENABLE);
    
    
	while (1)
	{
	
        /*
            注意：如果是使用 proteus 模拟程序的话
            VDDA 和 VSSA 需要 分别接 VDD 和 GND
        */

        showAnalogVoltage(1,adc_channel_result[0]);
        showAnalogVoltage(2,adc_channel_result[1]);
        showAnalogVoltage(3,adc_channel_result[2]);
        showAnalogVoltage(4,adc_channel_result[3]);
        
        //Delay_s(1);
        //restart_dma();
	}
}

void showAnalogVoltage(uint8_t lineNumber,uint16_t analog){
        
        //OLED_ShowNum(lineNumber,6,analog,5);
        
        // 因为adc模块的参考电压接的是3.3v，所以这里是 3.3
        // adc 量程最大只有12位，转换为16进制就是 0xfff
        float voltage =  (3.3 * analog) /  4096 ;
        
        OLED_ShowNum(lineNumber,6,(int)voltage,2);
        OLED_ShowNum(lineNumber,9,(int)(voltage*100)%100,2);
        

}

void DMA1_Channel1_IRQHandler(void){

    if(DMA_GetITStatus(DMA1_IT_TC1)==SET){
    
        DMA_ClearITPendingBit(DMA1_IT_TC1);
    }

}

